package net.siufung.boot.jwt.service;

import io.jsonwebtoken.Claims;
import net.siufung.boot.jwt.entity.JwtToken;

import java.util.Date;
import java.util.Map;

/**
 * @author 陈建峰
 * @since 2022/5/1 6:04 下午
 */
public interface IJwtService {

    /**
     * 创建Jwt
     * @param subject 主题
     * @param claims  规则
     * @param expireMinutes 过期时间
     * @return JwtToken 字符串
     */
    String createJwt(String subject, Map<String, Object> claims, int expireMinutes) throws Exception;

    /**
     * 创建Jwt
     * @param claims 规则
     * @param expireMinutes 过期时间
     * @return JwtToken 字符串
     */
    String createJwt(Map<String, Object> claims, int expireMinutes) throws Exception;

    /**
     * 返回JwtToken对象
     * @param claims 规则
     * @param expireMinutes 过期时间
     * @return JwtToken对象
     */
    JwtToken createJwtToken(Map<String, Object> claims, int expireMinutes) throws Exception;

    /**
     * jwtToken字符串转换成Claims
     * @param token jwtToken字符串
     * @return Claims
     */
    Claims parseJwt(String token);

    /**
     * 验证Token是否有效 无效返回TRUE
     * @param token jwtToken字符串
     * @return true/false
     */
    boolean isInvalid(String token);

    /**
     * 获取Jwt的失效时间
     * @param token jwtToken字符串
     * @return true/false
     */
    Date getExpireDate(String token);

    /**
     * 获取Jwt的失效时间
     * @param token jwtToken字符串
     * @return true/false
     */
    void setExpireDate(String token, Date expireDate);

    /**
     * JwtToken 是否超时
     * @param token jwtToken字符串
     * @return true/false
     */
    boolean isExpired(String token);

    /**
     * 刷新JwtToken
     * @param token jwtToken字符串
     * @param subject 主题
     * @param expireMinutes 过期时间
     * @return 刷新Token返回Jwt
     */
    String refreshJwt(String token, String subject, int expireMinutes);


    /**
     * 刷新JwtToken
     * @param token jwtToken字符串
     * @param expireMinutes 过期时间
     * @return 刷新Token返回Jwt
     */
    String refreshJwt(String token, int expireMinutes);


    /**
     * 刷新Token
     * @param jwtToken jwtToken对象
     * @return 刷新Token返回JwtToken对象
     */
    JwtToken refreshJwtToken(JwtToken jwtToken);


    /**
     * 刷新JwtToken
     * @param jwtToken jwtToken字符串
     * @param expireMinutes 过期时间
     * @return 刷新Token返回JwtToken对象
     */
    JwtToken refreshJwtToken(String jwtToken, int expireMinutes);

}
